﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Runtime.Serialization.Formatters.Binary;

namespace AvaProvi
{
    [Serializable]
    public class clsEnfoqueBase:clsEstado,ICloneable
    {
        #region Variables de Clase
        private double dbFactorComercializacion;
        private double dbFactorZona;
        private double dbFactorUbicacion;
        private double dbSuperficieDeTerreno;
        private double dbFactorOtro;
        private DateTime dtFechaDeInvestigacion;
        #endregion

        #region Porpiedades de clase
        public int IDEnfoque { get; set; }
        public string Calle { get; set; }
        public string Colonia { get; set; }
        public string CP { get; set; }
        public string UsoSuelo { get; set; }
        public string CalidadDeZona { get; set; }
        public string Fuente { get; set; }
        public string Informes { get; set; }
        public string Telefono { get; set; }
        public string TipoInmueble { get; set; }
        public DateTime FechaDeInvestigacion
        {
            get { return dtFechaDeInvestigacion; }
            set
            {
                TimeSpan antiguedad = this.EnfoqueDeMercado.Inmueble.Avaluo.FechaAvaluo - value.Date;
                if (antiguedad.TotalDays == 150 || antiguedad.TotalDays > 150)
                {
                    MessageBox.Show("La antigüedad del los datos comparables del inmueble debe ser menor a 5 meses", "Comparativo demasiado antigüo", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    dtFechaDeInvestigacion = this.EnfoqueDeMercado.Inmueble.Avaluo.FechaAvaluo;
                }
                else
                    dtFechaDeInvestigacion = value;
            }
        }
        public double SuperficieDeTerreno
        {
            get
            {
                return dbSuperficieDeTerreno;
            }
            set
            {
                //if ((value < this.EnfoqueDeMercado.ValorDeTerrenoPermitidoDesde) || (value > this.EnfoqueDeMercado.ValorDeTerrenoPermitidoHasta))
                //{
                //    MessageBox.Show("La superficie del terreno de investigación no puede ser \nmayor al 200% ni menor al 50% de\nla superficie del terreno de avaluo en cuestión", "Superficie inválida", MessageBoxButtons.OK, MessageBoxIcon.Error);
                //    this.dbSuperficieDeTerreno = 0;
                //}
                //else
                    this.dbSuperficieDeTerreno = value;
            }
        }
        public double FactorZona
        {
            get { return dbFactorZona; }
            set
            {
                    dbFactorZona = value;
            }
        }
        public double FactorUbicacion
        {
            get { return dbFactorUbicacion; }
            set
            {
                dbFactorUbicacion = value;
            }
        }
        public double FactorOtro
        {
            get { return dbFactorOtro; }
            set
            {
                dbFactorOtro = value;
            }
        }
        public double FactorDeReferencia
        {
            get
            {
                return ObtieneFactorDeReferencia();
            }
        }
        public double FactorComercializacion
        {
            get { return dbFactorComercializacion; }
            set
            {
                if (value > 1)
                {
                    MessageBox.Show("El factor de comercialización no puede ser mayor a la unidad", "Factor inválido", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    dbFactorComercializacion = 1;
                }
                else
                    dbFactorComercializacion = value;
            }
        }
        public double FactorSuperficie
        {
            get
            {
               return ObtieneFactorSuperficie();
            }
        }
        public clsEnfoqueDeMercado_CRN EnfoqueDeMercado { get; set; }
        public string Justificacion { get; set; }
        public string Etiqueta { get; set; }
        #endregion

        public clsEnfoqueBase(clsEnfoqueDeMercado_CRN objEnfoque):base()
        {
            this.EnfoqueDeMercado = objEnfoque;
            this.CalidadDeZona = string.Empty;
            this.Calle = string.Empty;
            this.Colonia = string.Empty;
            this.CP = string.Empty;
            this.FactorOtro = 1;
            this.FactorUbicacion = 1;
            this.FactorZona = 1;
            this.FechaDeInvestigacion = DateTime.Now;
            this.Fuente = string.Empty;
            this.Informes = string.Empty;
            this.Telefono = string.Empty;
            this.TipoInmueble = string.Empty;
            this.UsoSuelo = string.Empty;
            this.Justificacion = string.Empty;
            this.FactorComercializacion = 1;
           
        }

        public virtual double ObtieneFactorSuperficie()
        {
            return 0;
        }

        public virtual bool FactorValido(double valorFactor)
        {
            if ((valorFactor < 0.8) || (valorFactor > 1.2))
            {
                //MessageBox.Show("Solo se pueden introducir valores de homologación entr 0.80 y 1.2", "Valor NO válido", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return false;
            }
            return true;
        }

        public virtual double ObtieneFactorDeReferencia()
        {
            return 0;
        }


        #region ICloneable Members

        public virtual object Clone()
        {
            MemoryStream ms = new MemoryStream();
            BinaryFormatter bf = new BinaryFormatter();
            bf.Serialize(ms, this);
            ms.Position = 0;
            object obj = bf.Deserialize(ms);
            ms.Close();
            return obj;
        }

        public virtual void Pegar(object objEnfoque)
        {
            clsEnfoqueBase objEnfoqueBase = (clsEnfoqueBase)(objEnfoque);
            this.CalidadDeZona = objEnfoqueBase.CalidadDeZona;
            this.Calle = objEnfoqueBase.Calle;
            this.Colonia = objEnfoqueBase.Colonia;
            this.CP = objEnfoqueBase.CP;
            this.FactorComercializacion = objEnfoqueBase.FactorComercializacion;
            this.FactorOtro = objEnfoqueBase.FactorOtro;
            this.FactorUbicacion = objEnfoqueBase.FactorUbicacion;
            this.FactorZona = objEnfoqueBase.FactorZona;
            this.FechaDeInvestigacion = objEnfoqueBase.FechaDeInvestigacion;
            this.Fuente = objEnfoqueBase.Fuente;
            this.Informes = objEnfoqueBase.Informes;
            this.Justificacion = objEnfoqueBase.Justificacion;
            this.SuperficieDeTerreno = objEnfoqueBase.SuperficieDeTerreno;
            this.Telefono = objEnfoqueBase.Telefono;
            this.TipoInmueble = objEnfoqueBase.TipoInmueble;
            this.UsoSuelo = objEnfoqueBase.UsoSuelo;

        }

        #endregion
    }
}
